package eu.catengine.renderable.shape;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import javax.microedition.khronos.opengles.GL10;

import eu.catengine.primitive.Point;
import eu.catengine.primitive.Size;

/**
 * Klasa przechowująca dane dotyczące prostokąta wyświetlanego w scenie. <br>
 * <br>
 * Punt zaczepienia obiektu (anchor point) znajduje się w lewym górnym rogu.
 * 
 * @author mbienkowski
 */
public class Rectangle extends Shape
{
    /**
     * Tworzy prostokąt.
     * 
     * @param point
     *            <code>Point</code> Punkt zaczepienia.
     * @param size
     *            <code>Size</code> Rozmiar prostokąta.
     */
    public Rectangle(Point point, Size size)
    {
	setRectangleData("", point.x, point.y, size.width, size.height);
    }

    /**
     * Tworzy prostokąt.
     * 
     * @param x
     *            <code>float</code> Współrzędna X punktu zaczepienia.
     * @param y
     *            <code>float</code> Współrzędna Y punktu zaczepienia.
     * @param size
     *            <code>Size</code> Rozmiar prostokąta.
     */
    public Rectangle(float x, float y, Size size)
    {
	setRectangleData("", x, y, size.width, size.height);
    }

    /**
     * Tworzy prostokąt.
     * 
     * @param x
     *            <code>float</code> Współrzędna X punktu zaczepienia.
     * @param y
     *            <code>float</code> Współrzędna Y punktu zaczepienia.
     * @param width
     *            <code>float</code> Szerokość.
     * @param height
     *            <code>float</code> Wysokość.
     */
    public Rectangle(float x, float y, float width, float height)
    {
	setRectangleData("", x, y, width, height);
    }

    /**
     * Tworzy prostokąt.
     * 
     * @param id
     *            <code>String</code> Nazwa obiektu.
     * @param point
     *            <code>Point</code> Punkt zaczepienia.
     * @param size
     *            <code>Size</code> Rozmiar prostokąta.
     */
    public Rectangle(String id, Point point, Size size)
    {
	setRectangleData(id, point.x, point.y, size.width, size.height);
    }

    /**
     * Tworzy prostokąt.
     * 
     * @param id
     *            <code>String</code> Nazwa obiektu.
     * @param x
     *            <code>float</code> Współrzędna X punktu zaczepienia.
     * @param y
     *            <code>float</code> Współrzędna Y punktu zaczepienia.
     * @param size
     *            <code>Size</code> Rozmiar prostokąta.
     */
    public Rectangle(String id, float x, float y, Size size)
    {
	setRectangleData(id, x, y, size.width, size.height);
    }

    /**
     * Tworzy prostokąt.
     * 
     * @param id
     *            <code>String</code> Nazwa obiektu.
     * @param x
     *            <code>float</code> Współrzędna X punktu zaczepienia.
     * @param y
     *            <code>float</code> Współrzędna Y punktu zaczepienia.
     * @param width
     *            <code>float</code> Szerokość.
     * @param height
     *            <code>float</code> Wysokość.
     */
    public Rectangle(String id, float x, float y, float width, float height)
    {
	setRectangleData(id, x, y, width, height);
    }

    private void setRectangleData(String id, float x, float y, float width, float height)
    {
	mVisible = true;
	mKeepInScene = true;

	this.setName(id);
	this.mSize = new Size(width, height);
	this.mVertices = new float[] { x, y - height, // V1 - bottom left
		x, y, // V2 - top left
		x + width, y - height, // V3 - bottom right
		x + width, y // V4 - top right
	};
	this.mVerticesCount = this.mVertices.length / 2;
	ByteBuffer byteBuffer = ByteBuffer.allocateDirect(this.mVertices.length * 4);
	byteBuffer.order(ByteOrder.nativeOrder());
	this.mVertexBuffer = byteBuffer.asFloatBuffer();
	this.mVertexBuffer.put(this.mVertices);
	this.mVertexBuffer.position(0);
    }

    @Override
    public void draw(GL10 gl)
    {
	if (mVisible == false)
	    return;

	gl.glPushMatrix();
	gl.glEnable(GL10.GL_BLEND);
	gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
	gl.glEnable(GL10.GL_ALPHA_BITS);
	gl.glColor4f(mColor.red, mColor.green, mColor.blue, mColor.alpha);
	gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
	gl.glFrontFace(GL10.GL_CW);
	gl.glVertexPointer(2, GL10.GL_FLOAT, 0, this.mVertexBuffer);
	gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, this.mVerticesCount);
	gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
	gl.glDisable(GL10.GL_ALPHA_BITS);
	gl.glDisable(GL10.GL_TEXTURE_2D);
	gl.glPopMatrix();
    }

    @Override
    public void update(long elapsedTime)
    {
	// TODO Auto-generated method stub

    }

}
